home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / util / cli / mcomms_1_4.lha / Src / clickstart37.c < prev    next >
C/C++ Source or Header  |  1995-08-31  |  7KB  |  229 lines

  1. /*
  2. **    clickstart.c - enable/disable features of AmigaDOS
  3. **    Copyright ⌐ 1994-95 Michael Letowski
  4. */
  5.  
  6. #define __USE_SYSBASE
  7.  
  8. #include <exec/types.h>
  9. #include <exec/execbase.h>
  10. #include <dos/rdargs.h>
  11. #include <dos/var.h>
  12. #include <devices/trackdisk.h>
  13. #include <support/types.h>
  14. #include <support/exec.h>
  15. #include <support/dos.h>
  16.  
  17. #include <proto/exec.h>
  18. #include <proto/dos.h>
  19.  
  20. #include "clickstart.rev.h"
  21.  
  22.  
  23. #define DOS_NAME        "dos.library"
  24. #define DOS_VERN        37L
  25. #define TRACK_NAME    "trackdisk.device"
  26.  
  27. /* Args template */
  28. #define TEMPLATE        "CLICK/S,NOCLICK/S,STAR/S,NOSTAR/S,"\
  29.                                         "PIPE/K,NOPIPE/S,MULTI/K,NOMULTI/S,"\
  30.                                         "RETRY/K/N,QUANTUM/K/N,QUIET/S"
  31.  
  32. /* Info message */
  33. #define MSG_STATUS    "System state:\n"\
  34.                                         "\tClick is %s\n"\
  35.                                         "\tStar is %s\n"\
  36.                                         "\tPipe char is %s\n"\
  37.                                         "\tMulti command char is %s\n"\
  38.                                         "\tNumber of retries is %ld\n"\
  39.                                         "\tDispatch quantum is %ld frame%s\n"
  40.  
  41. /* Pipe enable/disable */
  42. #define PIPE_VAR_NAME        "_pchar"
  43.  
  44. /* Multi command enable/disable */
  45. #define MULTI_VAR_NAME    "_mchar"
  46.  
  47. #define VAR_LEN                    1
  48. #define VAR_FLAGS                (LV_VAR | GVF_LOCAL_ONLY)
  49. #define VAR_SIZE                (VAR_LEN+3)
  50.  
  51. /* Default pipe and multi characters */
  52. #define DEF_PIPE                "|"
  53. #define DEF_MULTI                "\\"
  54.  
  55. /* On/off texts */
  56. #define ON                            "ON"
  57. #define OFF                            "OFF"
  58. #define UNKNOWN                    "?"
  59.  
  60. /* Ranges */
  61. #define MIN_RETRY                0
  62. #define MAX_RETRY                255
  63. #define MIN_ALERT                0
  64. #define MAX_ALERT                0x7FFFFFFF
  65. #define MIN_QUANT                1
  66. #define MAX_QUANT                65535
  67.  
  68. #define PStr(arg,def)        (*(arg)=='\0' ? (def) : (arg))
  69.  
  70. STATIC CONST TEXT VersionString[]=
  71.     VERSION(PROG_NAME,PROG_VERSION,PROG_REVISION,PROG_DATE);
  72.  
  73. struct Options
  74. {
  75.     LONG   opt_Click;                                                            /* C=CLICK/S */
  76.     LONG   opt_NoClick;                                                        /* NC=NOCLICK/S */
  77.     LONG   opt_Star;                                                            /* S=STAR/S */
  78.     LONG   opt_NoStar;                                                        /* NS=NOSTAR/S */
  79.     STRPTR opt_Pipe;                                                            /* P=PIPE/K */
  80.     LONG   opt_NoPipe;                                                        /* NP=NOPIPE/S */
  81.     STRPTR opt_Multi;                                                            /* M=MULTI/S */
  82.     LONG   opt_NoMulti;                                                        /* NM=NOMULTI/S */
  83.     LONG  *opt_Retry;                                                            /* R=RETRY/K/N */
  84.     LONG  *opt_Quant;                                                            /* Q=QUANTUM/K/N */
  85.     LONG   opt_Quiet;                                                            /* QUIET/S */
  86. };    /* Options */
  87.  
  88. struct States
  89. {
  90.     STRPTR state_Click;
  91.     STRPTR state_Star;
  92.     STRPTR state_Pipe;
  93.     STRPTR state_Multi;
  94.     LONG   state_Retry;
  95.     LONG   state_Quant;
  96.     STRPTR state_QuantS;
  97. };    /* States */
  98.  
  99. STATIC VOID HandleTrackDisk(struct Options *opts, struct States *stat, LONG *error);
  100. STATIC VOID HandleVar(STRPTR varName, STRPTR varVal, STRPTR defVal, LONG off,
  101.                                             LONG *error, STRPTR *result, struct DosLibrary *DOSBase);
  102.  
  103. LONG ClickStart(VOID)
  104. {
  105.     struct ExecBase *SysBase=*((struct ExecBase **)4);
  106.     struct DosLibrary *DOSBase;
  107.  
  108.     CHAR PipeVal[VAR_SIZE],MultiVal[VAR_SIZE];
  109.     struct Options Opts;
  110.     struct States Stat;
  111.     struct RDArgs *Args;
  112.     LONG *DOSFlags,RC=RETURN_FAIL;
  113.  
  114.     /* Open DOS */
  115.     unless(DOSBase=(struct DosLibrary *)OpenLibrary(DOS_NAME,DOS_VERN))
  116.         throw2(SetResult2(ERROR_INVALID_RESIDENT_LIBRARY), NO_DOS);
  117.  
  118.     /* Read arguments */
  119.     clear(&Opts);                                                            /* Clear out buffer */
  120.     unless(Args=ReadArgs(TEMPLATE,(LONG *)&Opts,NULL))
  121.         throw2(PrintFault(IoErr(),PROG_NAME),    NO_ARGS);
  122.     /* Check args */
  123.     if(Opts.opt_Click && Opts.opt_NoClick || Opts.opt_Star && Opts.opt_NoStar ||
  124.             Opts.opt_Pipe && Opts.opt_NoPipe || Opts.opt_Multi && Opts.opt_NoMulti)
  125.         throw2(CauseIoErr(ERROR_TOO_MANY_ARGS,PROG_NAME),    BAD_ARGS);
  126.     /* Make values legal*/
  127.     if(Opts.opt_Retry)    *Opts.opt_Retry=clamp(*Opts.opt_Retry,MIN_RETRY,MAX_RETRY);
  128.     if(Opts.opt_Quant)    *Opts.opt_Quant=clamp(*Opts.opt_Quant,MIN_QUANT,MAX_QUANT);
  129.  
  130.     RC=RETURN_ERROR;                                                    /* Working a bit */
  131.  
  132.     /* Handle clicking */
  133.     HandleTrackDisk(&Opts,&Stat,&RC);
  134.  
  135.     /* Wildstar */
  136.     DOSFlags=&DOSBase->dl_Root->rn_Flags;
  137.     if(Opts.opt_Star)        fset(*DOSFlags,RNF_WILDSTAR);
  138.     if(Opts.opt_NoStar)    fclr(*DOSFlags,RNF_WILDSTAR);
  139.     Stat.state_Star=ftst(*DOSFlags,RNF_WILDSTAR) ? ON : OFF;
  140.  
  141.     /* Piping */
  142.     Stat.state_Pipe=PipeVal;
  143.     HandleVar(PIPE_VAR_NAME,Opts.opt_Pipe,DEF_PIPE,
  144.                         Opts.opt_NoPipe,&RC,&Stat.state_Pipe,DOSBase);
  145.  
  146.     /* Multi command execution */
  147.     Stat.state_Multi=MultiVal;
  148.     HandleVar(MULTI_VAR_NAME,Opts.opt_Multi,DEF_MULTI,
  149.                         Opts.opt_NoMulti,&RC,&Stat.state_Multi,DOSBase);
  150.  
  151.     /* Quantum */
  152.     if(Opts.opt_Quant)    SysBase->Quantum=*Opts.opt_Quant;
  153.     Stat.state_Quant=SysBase->Quantum;
  154.     Stat.state_QuantS=(Stat.state_Quant==1) ? NULL : "s";
  155.  
  156.     unless(Opts.opt_Quiet)
  157.         VPrintf(MSG_STATUS,(LONG *)&Stat);
  158.  
  159.     catch(BAD_ARGS,    );
  160.     catch(NO_ARGS,    FreeArgs(Args));
  161.     catch(NO_DOS,        CloseLibrary((struct Library *)DOSBase));
  162.     return(RC);
  163. }    /* ClickStart */
  164.  
  165. STATIC VOID HandleTrackDisk(struct Options *opts, struct States *stat, LONG *error)
  166. {
  167.     struct ExecBase *SysBase=*((struct ExecBase **)4);
  168.  
  169.     struct MsgPort *Port;
  170.     struct IOExtTD *IO;
  171.     struct TDU_PublicUnit *TDUUnit;
  172.     ULONG Unit;
  173.  
  174.     stat->state_Click=UNKNOWN;                                        /* We don't know yet */
  175.  
  176.     try(Port=CreateMsgPort(),                                                            NO_PORT);
  177.     try(IO=CreateIORequest(Port,sizeof(struct IOExtTD)),    NO_IO)
  178.  
  179.     *error=RETURN_OK;                                                    /* Everything OK so far */
  180.     for(Unit=0; Unit<4; Unit++)                                /* For each drive */
  181.         if(OpenDevice(TRACK_NAME,Unit,(struct IORequest *)IO,0)==0)
  182.         {
  183.             TDUUnit=(struct TDU_PublicUnit *)IO->iotd_Req.io_Unit;
  184.             /* Disable/enable clicking */
  185.             if(opts->opt_Click)        fclr(TDUUnit->tdu_PubFlags,TDPF_NOCLICK);
  186.             if(opts->opt_NoClick)    fset(TDUUnit->tdu_PubFlags,TDPF_NOCLICK);
  187.             stat->state_Click=ftst(TDUUnit->tdu_PubFlags,TDPF_NOCLICK) ? OFF : ON;
  188.  
  189.             /* Change retry count */
  190.             if(opts->opt_Retry)        TDUUnit->tdu_RetryCnt=*opts->opt_Retry;
  191.             stat->state_Retry=TDUUnit->tdu_RetryCnt;
  192.  
  193.             /* Clean up */
  194.             CloseDevice((struct IORequest *)IO);
  195.         }
  196.  
  197.     catch(NO_PORT,    DeleteMsgPort(Port));
  198.     catch(NO_IO,        DeleteIORequest(IO));
  199. }    /* HandleTrackDisk */
  200.  
  201. STATIC VOID HandleVar(STRPTR varName, STRPTR varVal, STRPTR defVal, LONG off,
  202.                                             LONG *error, STRPTR *result, struct DosLibrary *DOSBase)
  203. {
  204.     STRPTR State=*result;
  205.     struct LocalVar *Var;
  206.  
  207.     if(varVal)
  208.         unless(SetVar(varName,PStr(varVal,defVal),VAR_LEN,VAR_FLAGS))
  209.         {
  210.             PrintFault(IoErr(),PROG_NAME);
  211.             *error=RETURN_ERROR;
  212.         }
  213.     if(off)
  214.         unless(DeleteVar(varName,VAR_FLAGS))
  215.         {
  216.             PrintFault(IoErr(),PROG_NAME);
  217.             *error=RETURN_ERROR;
  218.         }
  219.     if(Var=FindVar(varName,VAR_FLAGS))                        /* Could find var */
  220.     {
  221.         State[0]='\'';                                                            /* Store its contents */
  222.         State[1]=*(Var->lv_Value);
  223.         State[2]='\'';
  224.         State[3]='\0';
  225.     }
  226.     else                                                                                    /* Var nor found */
  227.         *result=OFF;                                                                /* So it's off */
  228. }    /* HandleVar */
  229.